package cn.joechow.quickcode.genterator;

import cn.joechow.quickcode.util.DirMaker;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;


/**
 * Created by JoeChow
 * on 2017/1/22.
 */
public class QuickCode {

    /**
     * 根据模板路径、生成路径、生成文件名、数据模型来生成一个文件
     * @param templateDir 模板文件夹绝对路径
     * @param templateName 模板文件名
     * @param targetDir 目标生成文件夹
     * @param targetName 目标生成文件名
     * @param data 生成目标的数据模型
     * @throws IOException
     * @throws TemplateException
     */
    public static void gen(String templateDir, String templateName,String targetDir,String targetName,Object data) throws IOException, TemplateException {

        info("Start...");

        if(templateDir == null || "".equals(templateDir)
                || templateName == null || "".equals(templateName)
                || targetDir == null || "".equals(targetDir)
                || targetName == null || "".equals(targetName) ){
            info("MataData has Null or Empty!");
            return ;
        }
        info("1111");
        // 获取生成代码路径
        if (!File.separator.equals(templateDir.charAt(templateDir.length() - 1))) {
            templateDir = templateDir + File.separator;
        }
        if (!File.separator.equals(targetDir.charAt(targetDir.length() - 1))) {
            targetDir = targetDir + File.separator;
        }
        //检测模板文件是否存在
        if(!new File(templateDir+templateName).exists() && !new File(templateDir+templateName).isFile()){
            err("Template is not exists! ");
            return ;
        }
        info("2222");

        Configuration configuration = getConfiguration(templateDir);
        Template template = configuration.getTemplate(templateName);

        //目标文件
        String target = targetDir + targetName;

        info("3333");
        File file = new File(target);
        DirMaker.createFile(file);
        Writer out = new FileWriter(file);
        template.process(data, out);
//        template.process(data, new OutputStreamWriter(System.out)); //输出到控制台
        out.flush();
        info("End...");
    }

    /**
     * 多文件生成，同一个模板，生成到同一个目录
     * 如果传入的是List<data> 则，生成多个文件
     * @param templateDir 模板文件夹
     * @param templateName 模板文件名
     * @param targetDir 目标生成文件夹
     * @param targetName 目标生成文件名 - list
     * @param dataList 生成目标的数据模型
     */
    public static void gen(String templateDir, String templateName,String targetDir, List<String> targetName, List<Object> dataList) throws IOException, TemplateException {
        if(targetName!=null && targetName.size()>0
                && dataList!=null && dataList.size()>0 && dataList.size()==targetName.size()){
            for(int i=0,size=targetName.size(); i<size; i++){
                gen(templateDir,templateName,targetDir,targetName.get(i),dataList.get(i));
            }
        }else{
            err("TargetName or DataModel List is null/empty ! Or targetSize!=modelSize");
        }
    }

    protected static Configuration getConfiguration(String templateSrc) {
        Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
        File file = new File(templateSrc);
        try {
            cfg.setDirectoryForTemplateLoading(file);
            cfg.setObjectWrapper(new DefaultObjectWrapper());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return cfg;
    }

    public static final String LogPrefix = "{QuickCode} -- ";

    public static void info(String message){
        System.out.println(LogPrefix + message);
    }

    public static void err(String message){
        System.err.println(LogPrefix + message);
    }
}
